

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=auto>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/fluid.png">
  <link rel="icon" href="/img/fluid.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="author" content="ShanCe">
  <meta name="keywords" content="">
  
    <meta name="description" content="操作系统进程和线程之间有什么区别12345671. 进程是运行中的程序，线程是进程内部的一个执行序列2. 进程是资源分配的单元，线程是执行单元3. 进程间切换代价大，线程间切换代价小4. 进程拥有资源多，线程拥有资源少5. 多个线程共享进程的资源延伸：进程为啥切换代价比线程大？ 参考资料:https:&#x2F;&#x2F;www.ruanyifeng.com&#x2F;blog&#x2F;2013&#x2F;04&#x2F;processes_and_t">
<meta property="og:type" content="article">
<meta property="og:title" content="面试">
<meta property="og:url" content="https://sweetshance.github.io/2024/03/22/python%E5%90%8E%E7%AB%AF%E9%9D%A2%E8%AF%95/1-python%E5%90%8E%E7%AB%AF%E9%9D%A2%E8%AF%95/index.html">
<meta property="og:site_name" content="ShanCe的博客">
<meta property="og:description" content="操作系统进程和线程之间有什么区别12345671. 进程是运行中的程序，线程是进程内部的一个执行序列2. 进程是资源分配的单元，线程是执行单元3. 进程间切换代价大，线程间切换代价小4. 进程拥有资源多，线程拥有资源少5. 多个线程共享进程的资源延伸：进程为啥切换代价比线程大？ 参考资料:https:&#x2F;&#x2F;www.ruanyifeng.com&#x2F;blog&#x2F;2013&#x2F;04&#x2F;processes_and_t">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2024-03-22T08:23:54.000Z">
<meta property="article:modified_time" content="2025-11-05T05:38:25.982Z">
<meta property="article:author" content="ShanCe">
<meta property="article:tag" content="python">
<meta name="twitter:card" content="summary_large_image">
  
  
    <meta name="referrer" content="no-referrer-when-downgrade">
  
  
  <title>面试 - ShanCe的博客</title>

  <link  rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css" />



  <link  rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css" />



<!-- 主题依赖的图标库，不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_hj8rtnfg7um.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_lbnruvf0jn.css">


<link  rel="stylesheet" href="/css/main.css" />


  <link id="highlight-css" rel="stylesheet" href="/css/highlight.css" />
  
    <link id="highlight-css-dark" rel="stylesheet" href="/css/highlight-dark.css" />
  




  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    Fluid.ctx = Object.assign({}, Fluid.ctx)
    var CONFIG = {"hostname":"sweetshance.github.io","root":"/","version":"1.9.4","typing":{"enable":true,"typeSpeed":70,"cursorChar":"_","loop":false,"scope":[]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":false,"follow_dnt":true,"baidu":null,"google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":null,"app_key":null,"server_url":null,"path":"window.location.pathname","ignore_local":false}},"search_path":"/local-search.xml"};

    if (CONFIG.web_analytics.follow_dnt) {
      var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
      Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
    }
  </script>
  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
  


  
<meta name="generator" content="Hexo 5.4.2"></head>


<body>
  

  <header>
    

<div class="header-inner" style="height: 70vh;">
  <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand" href="/">
      <strong>ShanCe</strong>
    </a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                <span>首页</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                <span>归档</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                <span>分类</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                <span>标签</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                <span>关于</span>
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
              <i class="iconfont icon-search"></i>
            </a>
          </li>
          
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">
              <i class="iconfont icon-dark" id="color-toggle-icon"></i>
            </a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

  

<div id="banner" class="banner" parallax=true
     style="background: url('/img/default.png') no-repeat center center; background-size: cover;">
  <div class="full-bg-img">
    <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
      <div class="banner-text text-center fade-in-up">
        <div class="h2">
          
            <span id="subtitle" data-typed-text="面试"></span>
          
        </div>

        
          
  <div class="mt-3">
    
      <span class="post-meta mr-2">
        <i class="iconfont icon-author" aria-hidden="true"></i>
        ShanCe
      </span>
    
    
      <span class="post-meta">
        <i class="iconfont icon-date-fill" aria-hidden="true"></i>
        <time datetime="2024-03-22 16:23" pubdate>
          2024年3月22日 下午
        </time>
      </span>
    
  </div>

  <div class="mt-1">
    
      <span class="post-meta mr-2">
        <i class="iconfont icon-chart"></i>
        
          7k 字
        
      </span>
    

    
      <span class="post-meta mr-2">
        <i class="iconfont icon-clock-fill"></i>
        
        
        
          59 分钟
        
      </span>
    

    
    
      
        <span id="busuanzi_container_page_pv" style="display: none">
          <i class="iconfont icon-eye" aria-hidden="true"></i>
          <span id="busuanzi_value_page_pv"></span> 次
        </span>
        
      
    
  </div>


        
      </div>

      
    </div>
  </div>
</div>

</div>

  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="side-col d-none d-lg-block col-lg-2">
      

    </div>

    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">面试</h1>
            
            
              <div class="markdown-body">
                
                <h2 id="操作系统"><a href="#操作系统" class="headerlink" title="操作系统"></a>操作系统</h2><h3 id="进程和线程之间有什么区别"><a href="#进程和线程之间有什么区别" class="headerlink" title="进程和线程之间有什么区别"></a>进程和线程之间有什么区别</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs markdown"><span class="hljs-bullet">1.</span> 进程是运行中的程序，线程是进程内部的一个执行序列<br><span class="hljs-bullet">2.</span> 进程是资源分配的单元，线程是执行单元<br><span class="hljs-bullet">3.</span> 进程间切换代价大，线程间切换代价小<br><span class="hljs-bullet">4.</span> 进程拥有资源多，线程拥有资源少<br><span class="hljs-bullet">5.</span> 多个线程共享进程的资源<br><br>延伸：进程为啥切换代价比线程大？<br></code></pre></td></tr></table></figure>
<p>参考资料:<a target="_blank" rel="noopener" href="https://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html">https://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html</a></p>
<h3 id="进程间有哪些通信方式"><a href="#进程间有哪些通信方式" class="headerlink" title="进程间有哪些通信方式"></a>进程间有哪些通信方式</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs markdown"><span class="hljs-bullet">1.</span> 管道(pipe): 管道是一种半双工的通信方式，数据只能单向流动，而且只能再具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。<br><span class="hljs-bullet">2.</span> 消息队列通信： 消息队列是由消息的链表，存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。<br><span class="hljs-bullet">3.</span> 信号量： 信号量是一个计数器，可以用来控制多个进程对共享资源的访问。它常作为一种锁机制，防止某进程正在访问共享资源时，其他进程也访问该资源。因此，主要作为进程间以及统一进程内不同线程之间的同步手段。<br><span class="hljs-bullet">4.</span> 信号：新年好是一种比较复杂的通讯方式，用于通知接收进程某个事件已经发生。<br><span class="hljs-bullet">5.</span> 共享内存通信：共享内存就是映射一段能被其他进程所访问的内存，这段共享内存由一个进程创建，但多个进程都可以访问，共享内存是最快的IPC方式，他是针对其他进程间通讯方式运行效率低儿专门设计的。它往往与其他通讯机制，如信号量 配合使用，来实现进程间的同步和通信。<br><span class="hljs-bullet">6.</span> socket: 套接口也是一种进程间通讯机制，与其他通讯机制不同的是，它可用于不同机器间的进程通讯。<br></code></pre></td></tr></table></figure>
<p>参考资料：<a target="_blank" rel="noopener" href="https://blog.csdn.net/violet_echo_0908/article/details/51201278">https://blog.csdn.net/violet_echo_0908/article/details/51201278</a></p>
<h3 id="简述-socket-中-select-与epoll的使用场景以及区别？"><a href="#简述-socket-中-select-与epoll的使用场景以及区别？" class="headerlink" title="简述 socket 中 select 与epoll的使用场景以及区别？"></a>简述 socket 中 select 与epoll的使用场景以及区别？</h3><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs ada">两个网络某型本质都是IO多路复用的<br><br><span class="hljs-keyword">select</span> 需要不断的去轮询数据，时间复杂度为o(n),性能比较低。并且他的文件描述符也是有限的。像常见的服务器软件apache用的就是这种网络模型。<br><br>而epoll则不一样，他不会去轮询，而是会注册一个监听事件，每当数据有变化的时候，就会通知。像现在的nginx底层网络模型就是epoll<br><br><br>注意：在连接数少并且连接数十分活跃的情况下，<span class="hljs-keyword">select</span>和poll的性能可能比epoll好，毕竟epoll的通知机制需要很多函数的回调。<br><br></code></pre></td></tr></table></figure>
<p>参考资料：<a target="_blank" rel="noopener" href="https://www.cnblogs.com/aspirant/p/9166944.html">https://www.cnblogs.com/aspirant/p/9166944.html</a></p>
<h4 id="epoll-的水平出发和边缘触发有什么不同。"><a href="#epoll-的水平出发和边缘触发有什么不同。" class="headerlink" title="epoll 的水平出发和边缘触发有什么不同。"></a>epoll 的水平出发和边缘触发有什么不同。</h4><p><strong>水平触发(Level_triggered):</strong> 当被监控的文件描述符上有可读写事件发生时，epoll_wait() 会通知处理程序去读写。如果这次没有把数据一次性全部读写完（如读写缓冲区太小），那么下次调用 epoll_wait()时，他还会通知你在上一次没读写完的文件描述，继续读写，如果你一直不去读写，会一直通知。如果系统中有大量你不需要读写的就绪文件描述符，而他们每次都会返回，这样会大大降低处理程序检索自己关心的就绪文件按描述符的效率。</p>
<p><strong>边缘触发(Edge_triggered):</strong> 当被监控的文件描述符上有可读写事件发生时，epool_wait()会通知处理程序去读写阿。如果这次没有把数据全部读写完，那下次调用时不会通知你，直到该文件描述符上出现第二次可读写事件才会通知。简单讲：一次读写事件只会通知一次。这种模式比水平触发效率高。</p>
<h3 id="Linux-进程调度中有哪些常见算法以及策略？"><a href="#Linux-进程调度中有哪些常见算法以及策略？" class="headerlink" title="Linux 进程调度中有哪些常见算法以及策略？"></a>Linux 进程调度中有哪些常见算法以及策略？</h3><ol>
<li>先来先服务和短作业(进程)优先调度算法</li>
<li>高优先权优先调度算法<br> 非抢占式优先算法<br> 抢占式优先算法</li>
</ol>
<p>参考资料：<a target="_blank" rel="noopener" href="https://ww.cnblogs.com/lyl-312/p/5578945.html">https://ww.cnblogs.com/lyl-312/p/5578945.html</a></p>
<h3 id="操作系统是如何申请以及管理内存的？（内存的工作原理）"><a href="#操作系统是如何申请以及管理内存的？（内存的工作原理）" class="headerlink" title="操作系统是如何申请以及管理内存的？（内存的工作原理）"></a>操作系统是如何申请以及管理内存的？（内存的工作原理）</h3><p>虚拟内存： 现有内存无法满足大进程的内存要求<br><strong>覆盖:</strong> 在早期使用覆盖来解决这个问题。将整个程序分成多个块，先将0块加入内存，执行完后将1块加入内存，依次往复。最大问题是需要程序员去把程序进行分块。<br><strong>虚拟内存:</strong> 每个进程拥有独立的逻辑地址空间，内存被分为大小相等的多个块，称为页，每个页都是一段连续的地址，对于进程来看，逻辑上貌似有很多内存空间，其中一部分对应物理内存上的一块（称为页框，通常给页和页框大小相等），还有一些没有加载，在内存中的对应的硬盘上</p>
<h3 id="简述Linux-系统态与用户态，什么时候会进入系统态"><a href="#简述Linux-系统态与用户态，什么时候会进入系统态" class="headerlink" title="简述Linux 系统态与用户态，什么时候会进入系统态"></a>简述Linux 系统态与用户态，什么时候会进入系统态</h3><ol>
<li>系统调用</li>
<li>发生异常，当CPU在执行运行在用户态的程序的时候，突然发生某些预先不可知的一场事件，这个时候会触发从当前用户态执行的进程转向内核态执行相关的异常事件，典型的如缺页异常</li>
<li>外围设备的中断：当外围设备完成用户的请求操作后，会像CPU发出中断信号，此时，CPU就会暂停执行下一条即将要执行的指令，转而去执行中断信号对应的处理程序，如果先前执行的指令是在用户态下，则自然会从用户态到内核态的状态</li>
</ol>
<h3 id="简述LRU算法及其实现方式"><a href="#简述LRU算法及其实现方式" class="headerlink" title="简述LRU算法及其实现方式"></a>简述LRU算法及其实现方式</h3><p><strong>LRU(least recently user),最近最久未使用法：</strong> 最近使用的页面数据会在未来一段时期内仍然被使用，已经很久没有使用的页面很有可能在未来较长的一段事件内仍然不会被使用。主要指标是使用时间，附加指标是使用的次数，基于这个思想，会存在一种缓存淘汰机制。<br>利用双向链表实现。</p>
<h3 id="线程通讯"><a href="#线程通讯" class="headerlink" title="线程通讯"></a>线程通讯</h3><p>共享变量、共享内存、共享数据库、消息队列</p>
<h3 id="同步、异步，阻塞、非阻塞"><a href="#同步、异步，阻塞、非阻塞" class="headerlink" title="同步、异步，阻塞、非阻塞"></a>同步、异步，阻塞、非阻塞</h3><p>只有同步才有阻塞非阻塞</p>
<p>同步、异步： 重点关注方式<br>阻塞、非阻塞：中带你关注结果</p>
<p>同步：当请求后，等待，直到结果返回<br>异步： 执行一个操作后，可以去执行其他操作，等待通知在会俩执行刚才没执行完的操作<br>阻塞：进程给CPU传达一个任务，一直等待CPU处理完成，然后才执行后面的操作。<br>非阻塞：进程给CPU传达任务后，继续后续操作，隔断时间再来询问之前的操作是否完成（轮询）</p>
<h2 id="网络协议"><a href="#网络协议" class="headerlink" title="网络协议"></a>网络协议</h2><h3 id="TCP三次握手以及四次挥手流程。为什么需要三次握手四次挥手？"><a href="#TCP三次握手以及四次挥手流程。为什么需要三次握手四次挥手？" class="headerlink" title="TCP三次握手以及四次挥手流程。为什么需要三次握手四次挥手？"></a>TCP三次握手以及四次挥手流程。为什么需要三次握手四次挥手？</h3><h4 id="为什么-time-wait-状态还需要等2MSL后才能返回CLOSE状态"><a href="#为什么-time-wait-状态还需要等2MSL后才能返回CLOSE状态" class="headerlink" title="为什么 time_wait 状态还需要等2MSL后才能返回CLOSE状态"></a>为什么 time_wait 状态还需要等2MSL后才能返回CLOSE状态</h4><ul>
<li>无法保证最后发送的ACK报文会一定被对方收到，所以需要重发可能丢失的ACK报文</li>
<li>关闭链接一段时间后可能会出现相同的IP地址和端口建立新的连接，为了防止旧连接的重复分组在新连接已经终止后再现，2MSL足以让分组最多存活msl秒被丢弃。</li>
</ul>
<h4 id="为什么必须是三次握手，不能用两次握手进行连接？"><a href="#为什么必须是三次握手，不能用两次握手进行连接？" class="headerlink" title="为什么必须是三次握手，不能用两次握手进行连接？"></a>为什么必须是三次握手，不能用两次握手进行连接？</h4><p> 两次握手容易死锁！如果服务器的应答分组在传输中丢失， S将不知道建立什么样的序列号， C 认为连接还未建立成功，将忽略S发来的任何分组数据，只等待连接确认。而S在发出的分组超时后，重复发送同样的分组，这样就形成了死锁<br> （S:服务器， C:客户端）</p>
<h3 id="http-和-https-有哪些区别"><a href="#http-和-https-有哪些区别" class="headerlink" title="http 和 https 有哪些区别?"></a>http 和 https 有哪些区别?</h3><ul>
<li>HTTPS 协议需要到证书颁发机构CA申请证书，HTTP不用申请证书</li>
<li>HTTP 是超文本传输协议，属于应用层信息传输，HTTPS则是具有SSL加密的安全醒传输协议，对数据的传输进行加密，相当于HTTP的升级版；</li>
<li>HTTP和HTTPS使用的是完全不同的连接方式，用的端口也不一样，前者是80，后者是443；</li>
<li>HTTP的连接很简单，是无状态的；HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，比HTTP协议安全</li>
</ul>
<p>(用非对称加密获取签名证书，用对称加密获取加密数据交换)<br>扩展链接:<a target="_blank" rel="noopener" href="https://blog.csdn.net/whl190412/article/details/91865397">https://blog.csdn.net/whl190412/article/details/91865397</a></p>
<h3 id="一次HTTP请求发生了什么？"><a href="#一次HTTP请求发生了什么？" class="headerlink" title="一次HTTP请求发生了什么？"></a>一次HTTP请求发生了什么？</h3><p>参考链接：<a target="_blank" rel="noopener" href="https://blog.csdn.net/q9_40804005/article/details/82876209">https://blog.csdn.net/q9_40804005/article/details/82876209</a></p>
<h3 id="RestFul-与-RPC-的区别是什么？-RestFul-的优点？"><a href="#RestFul-与-RPC-的区别是什么？-RestFul-的优点？" class="headerlink" title="RestFul 与 RPC 的区别是什么？ RestFul 的优点？"></a>RestFul 与 RPC 的区别是什么？ RestFul 的优点？</h3><ul>
<li><p><strong>RPC(Remote Procedure Call)</strong>: 远程过程调用，解决 1.分布式系统中，服务之间的调用问题。2.远程调用时（调用远端的方法），要能像本地调用一样方便，让调用者感知不到远程调用的逻辑。</p>
</li>
<li><p>RPC是面向过程， RestFul 是面向资源的，并且使用了HTTP动词。</p>
</li>
</ul>
<p>参考链接：<a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/36427583">https://zhuanlan.zhihu.com/p/36427583</a></p>
<h3 id="TCP-的keepalive-了解吗？说一说它和http的keepalive的区别？"><a href="#TCP-的keepalive-了解吗？说一说它和http的keepalive的区别？" class="headerlink" title="TCP 的keepalive 了解吗？说一说它和http的keepalive的区别？"></a>TCP 的keepalive 了解吗？说一说它和http的keepalive的区别？</h3><p>http 的keep-alive 与 tcp 的 keep-alive,意图不一样。 http keep-alive是为了让tcp活得更久一点，以便在同一个连接上传送多个http，提高socket效率。而tcp keep-alive是tcp的一种检测tcp连接状况的保鲜机制。</p>
<h3 id="简述-HTTP-1-0，-1-1，-1-2的主要区别"><a href="#简述-HTTP-1-0，-1-1，-1-2的主要区别" class="headerlink" title="简述 HTTP 1.0， 1.1， 1.2的主要区别"></a>简述 HTTP 1.0， 1.1， 1.2的主要区别</h3><ul>
<li><p>HTTP 1.0 </p>
<ul>
<li>无状态、无连接</li>
</ul>
</li>
<li><p>HTTP1.1</p>
<ul>
<li>支持长连接，请求管道化（请求并行发送，相应仍然需有序返回）</li>
<li>增加缓存处理（新的字段如 cache-control）</li>
<li>增加Host字段, 适应虚拟主机技术发展，即一台服务器支持多台主机</li>
<li>支持断点传输</li>
</ul>
</li>
<li><p>HTTP 1.2</p>
<ul>
<li>二进制分帧</li>
<li>多路复用（或连接共享）</li>
<li>头部压缩, encoder</li>
<li>服务器推送<br>参考：<a target="_blank" rel="noopener" href="https://www.cnblogs.com/heluan/p/8620312.html">https://www.cnblogs.com/heluan/p/8620312.html</a></li>
</ul>
</li>
</ul>
<h3 id="简述TCP协议的延迟-ACK-和累计应答"><a href="#简述TCP协议的延迟-ACK-和累计应答" class="headerlink" title="简述TCP协议的延迟 ACK 和累计应答"></a>简述TCP协议的延迟 ACK 和累计应答</h3><p>参考：<a target="_blank" rel="noopener" href="https://blog.csdn.net/u010647109/article/details/80365366">https://blog.csdn.net/u010647109/article/details/80365366</a></p>
<h3 id="简述TCP报文头结构"><a href="#简述TCP报文头结构" class="headerlink" title="简述TCP报文头结构"></a>简述TCP报文头结构</h3><p>16位端口号，32位序号，32位确认号，4位头部长度，6位标志位，16位窗口大小，16位校验和，16位紧急指针，TCP头部选项<br>参考：<a target="_blank" rel="noopener" href="https://blog.csdn.net/baidu_17611285/article/details/80171239">https://blog.csdn.net/baidu_17611285/article/details/80171239</a></p>
<h3 id="SYN攻击"><a href="#SYN攻击" class="headerlink" title="SYN攻击"></a>SYN攻击</h3><p>在三次握手过程中，服务器发送SYN-ACk之后，收到客户端的ACK之前的TCP连接称为半连接，此时服务器处于 SYN_RECV状态。当收到ACK后，服务器转入ESTABLISHED状态。</p>
<p>Syn攻击就是（攻击客户端），在短时间内伪造大量不存则的IP地址，向服务器不断发送SYN包，服务器回复确认包，并等待客户的确认，由于源地址不存在，服务器需要不断的重发直至超时，这些伪造的SYN包将长时间占用未连接队列，正常的SYN请求被丢弃，目标系统运行缓慢，严重者引起网络堵塞甚至系统瘫痪。</p>
<p>Syn 攻击是一个典型的Dos高攻击，在linux下可以如下命令检测</p>
<figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs 1c">netstat -n -p TCP <span class="hljs-string">| grep SYN_RECV</span><br></code></pre></td></tr></table></figure>
<p>一般较新的TCP/IP协议都会对这一过程防范，修改tcp协议实现，主要有 SynAttackProtect保护机制、SYNcookies 技术、增加最大半连接数和缩短超时时间等。</p>
<h2 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h2><h3 id="mysql为什么使用B-树作为索引，对比B树它的优点和缺点是什么？"><a href="#mysql为什么使用B-树作为索引，对比B树它的优点和缺点是什么？" class="headerlink" title="mysql为什么使用B+树作为索引，对比B树它的优点和缺点是什么？"></a>mysql为什么使用B+树作为索引，对比B树它的优点和缺点是什么？</h3><p>数据库索引采用B+树原因：B树在提高磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题，B+树营运而生，B+树采用双向链表实现快速查询，只要遍历叶子节点就可以实现整棵树的遍历，而且在数据库中基于范围查询是非常频繁的，而B树不支持这样的操作（效率低）</p>
<p>参考: <a target="_blank" rel="noopener" href="https://www.cnblogs.com/aspirant/p/9214485.html">https://www.cnblogs.com/aspirant/p/9214485.html</a><br>参考: <a target="_blank" rel="noopener" href="http://blog.codinglabs.org/articles/theory-of-mysql-index.html">http://blog.codinglabs.org/articles/theory-of-mysql-index.html</a></p>
<h3 id="数据库的事务隔离级别有哪些？各有哪些优缺点？"><a href="#数据库的事务隔离级别有哪些？各有哪些优缺点？" class="headerlink" title="数据库的事务隔离级别有哪些？各有哪些优缺点？"></a>数据库的事务隔离级别有哪些？各有哪些优缺点？</h3><h3 id="数据库事务的特性"><a href="#数据库事务的特性" class="headerlink" title="数据库事务的特性"></a>数据库事务的特性</h3><ul>
<li>原子性</li>
<li>一致性</li>
<li>隔离性</li>
<li>持久性</li>
</ul>
<h3 id="什么情况下会发生死锁，如何解决？"><a href="#什么情况下会发生死锁，如何解决？" class="headerlink" title="什么情况下会发生死锁，如何解决？"></a>什么情况下会发生死锁，如何解决？</h3><h3 id="简述乐观锁以及悲观锁区别以及使用场景。"><a href="#简述乐观锁以及悲观锁区别以及使用场景。" class="headerlink" title="简述乐观锁以及悲观锁区别以及使用场景。"></a>简述乐观锁以及悲观锁区别以及使用场景。</h3><p><strong>定义：</strong></p>
<ul>
<li>悲观锁：每次获取数据的时候，都会担心数据被修改，所以么此获取数据的时候都会进行加锁，确保在自己使用的过程中数据不会被别人修改，使用完成后进行数据解锁。由于数据进行加锁，期间对该数据进行读写的其他线程都会进行等待。</li>
<li>乐观锁：每次获取数据的时候，都不会担心数据被修改，所以每次获取数据的时候都不会进行加锁，但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改，则不进行数据更新，如果数据没有被其他线程修改，则进行数据更新。由于数据没有进行加锁，期间该数据可以被其他线程进行读写操作。</li>
<li><em>适用场景:</em>*</li>
<li>悲观锁：比较适合写入操作频繁的场景，如果出现大量的读取操作，每次读取的时候都会进行加锁，这样会增加大量的锁的开销，降低系统的吞吐量。</li>
<li>乐观锁：比较适合读取操作比较频繁的场景，如果出现大量的写入操作，数据发生冲突的可能性旧会增加，为了保证数据的一致性 ，应用层需要不断的重新获取数据，这样会增加大量的查询操作，降低了系统的吞吐量。<br>总结：读取频繁采用乐观锁，写入频繁采用悲观锁。</li>
</ul>
<h3 id="聚簇索引和非聚簇索引的区别？什么时候用聚簇索引？"><a href="#聚簇索引和非聚簇索引的区别？什么时候用聚簇索引？" class="headerlink" title="聚簇索引和非聚簇索引的区别？什么时候用聚簇索引？"></a>聚簇索引和非聚簇索引的区别？什么时候用聚簇索引？</h3><ul>
<li>聚簇索引：将数据与索引放到一块，找到索引也就找到了数据。</li>
<li>非聚簇索引：将数据与索引分开存储，索引结构的叶子节点指向了数据的对应行，myisam通过 key_buffer 把索引先缓存到内存中，当需要访问数据时（通过索引访问数据），在内存中直接所有索引，然后通过索引找到磁盘相应数据，这也是为什么索引不在key_buffer命中时，速度慢的原因。<br>参考：<a target="_blank" rel="noopener" href="https://www.jianshu.com/p/fa8192853184">https://www.jianshu.com/p/fa8192853184</a></li>
</ul>
<h3 id="唯一索引与普通索引的区别是什么？使用索引有哪些优缺点？"><a href="#唯一索引与普通索引的区别是什么？使用索引有哪些优缺点？" class="headerlink" title="唯一索引与普通索引的区别是什么？使用索引有哪些优缺点？"></a>唯一索引与普通索引的区别是什么？使用索引有哪些优缺点？</h3><p>唯一索引会限定数据唯一，而普通索引则没有</p>
<h3 id="mysql的索引什么情况下会失效？"><a href="#mysql的索引什么情况下会失效？" class="headerlink" title="mysql的索引什么情况下会失效？"></a>mysql的索引什么情况下会失效？</h3><p>参考：<a target="_blank" rel="noopener" href="https://blog.csdn.net/look_like/article/details/86486859">https://blog.csdn.net/look_like/article/details/86486859</a></p>
<h3 id="简述Mysql的主从同步机制"><a href="#简述Mysql的主从同步机制" class="headerlink" title="简述Mysql的主从同步机制"></a>简述Mysql的主从同步机制</h3><p>参考：<a target="_blank" rel="noopener" href="https://www.cnblogs.com/arebirth/p/mysqlmasterslaveprinciple.html">https://www.cnblogs.com/arebirth/p/mysqlmasterslaveprinciple.html</a><br>主从复制延迟？</p>
<h3 id="Redis实现延时队列"><a href="#Redis实现延时队列" class="headerlink" title="Redis实现延时队列"></a>Redis实现延时队列</h3><p>使用sortedset,用时间戳作为score，使用zadd key score1 value1 命令生产消息，使用 zrangebysocre key min max withscores limit 0 1 消费消息最早的一条消息。<br>这里选用redis主要的原因就是支持更高性能的score排序，同时redis的持久化bgsave特性，保证了消息的消费和存储问题。</p>
<h3 id="Rediso如何让防止缓存雪崩和缓存击穿？"><a href="#Rediso如何让防止缓存雪崩和缓存击穿？" class="headerlink" title="Rediso如何让防止缓存雪崩和缓存击穿？"></a>Rediso如何让防止缓存雪崩和缓存击穿？</h3><h4 id="缓存穿透"><a href="#缓存穿透" class="headerlink" title="缓存穿透"></a>缓存穿透</h4><p><strong>描述：</strong><br>缓存和数据库中都没有的数据，而用户不断的发起请求，如发起id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能时攻击者，攻击者会导致数据库压力过大。<br><strong>解决方案：</strong></p>
<ol>
<li>接口层增加校验，如用户鉴权，id基础校验，id&lt;=0的直接拦截；</li>
<li>从缓存取不到的数据，在数据库中也没有取到，这时也可以将key-value对 写成key-null，缓存有效时间可以设置短点，如30秒（设置太长时间会导致正常情况也没法使用）。</li>
</ol>
<h4 id="缓存击穿"><a href="#缓存击穿" class="headerlink" title="缓存击穿"></a>缓存击穿</h4><p><strong>描述：</strong><br>缓存击穿是，缓存中没有但数据库中有的数据（一般是缓存时间到期），这时由于并发用户特别多，同时读缓存没读到数据，又同时去数据库去取数据，引起数据库压力瞬间增大，造成压力过大<br><strong>解决方案：</strong></p>
<ol>
<li>设置热点数据永远不过期</li>
<li>加互斥锁</li>
</ol>
<h4 id="缓存雪崩"><a href="#缓存雪崩" class="headerlink" title="缓存雪崩"></a>缓存雪崩</h4><p><strong>描述：</strong><br>缓存雪崩是指缓存中数据大批量到过期时间，而查询数据量大，引发数据库压力过大甚至宕机。和缓存击穿不同的是，缓存击穿指并发同时查一条数据，缓存雪崩是不同数据都过期了，很多数据都查不到从而查数据库。<br><strong>解决方案：</strong></p>
<ol>
<li>缓存数据的过期时间设置随机，防止同一时间大量数据过期现象发生。</li>
<li>如果缓存数据库是分布式部署，将热点数据均匀分布在不同缓存数据库中</li>
<li>设置热点数据永远不过期。</li>
</ol>
<h3 id="简述redis持久化中rdb-以及-aof-方案的优缺点"><a href="#简述redis持久化中rdb-以及-aof-方案的优缺点" class="headerlink" title="简述redis持久化中rdb 以及 aof 方案的优缺点"></a>简述redis持久化中rdb 以及 aof 方案的优缺点</h3><p>参考：<a target="_blank" rel="noopener" href="https://blog.csdn.net/m0_38110132/article/details/76906422">https://blog.csdn.net/m0_38110132/article/details/76906422</a></p>
<h3 id="什么是事务"><a href="#什么是事务" class="headerlink" title="什么是事务"></a>什么是事务</h3><p>事务是一段sql的批处理，要不都执行，要不都回滚。四大特性</p>
<ol>
<li>原子性（要不都成功，要不都回滚）</li>
<li>一致性 (事务执行之前和执行之后都必须处于一致性状态)</li>
<li>隔离性（数据库为每一个童虎开启的事务，不能被其他事务的操作所干扰，多个并发事务之间要相互隔离）</li>
<li>持久性（一个事务一旦被提交了，那么对数据库中的数据的改变就是永久性的）<br>实现：<br>用 begin, rollback, commit 来实现，begin 开始一个事务， rollback事务回滚 commit事务确认。<br>直接用set 改变mysql的自动提交模式，set autocommit = 0 禁止自动提交，set autocommit=1 开启自动提交</li>
</ol>
<h3 id="数据库组合索引（最左前缀）"><a href="#数据库组合索引（最左前缀）" class="headerlink" title="数据库组合索引（最左前缀）"></a>数据库组合索引（最左前缀）</h3><p>a,b,c 三个字段组合的索引，只有筛选包含a的时候才走索引</p>
<h3 id="数据库优化"><a href="#数据库优化" class="headerlink" title="数据库优化"></a>数据库优化</h3><ol>
<li>优化索引、sql语句、分析慢查询</li>
<li>设计表的时候严格根据数据库的设计范式来设计数据库</li>
<li>使用缓存，把经常访问到的数据而且不经常变化的数据放在缓存中，节约磁盘IO</li>
<li>优化硬件：采用SSD</li>
<li>采用mysql自带的表分区技术，把数据分层不同的问及爱你，提高磁盘的读取效率</li>
<li>垂直分表：把一些不常读的数据放在一张表里，节约磁盘IO</li>
<li>主从分离读写：采用主从复制把数据库的读操作和写操作分离开</li>
<li>分库分表机器（数据量特别大）,主要的原理就是数据路由</li>
<li>选择合适的表引擎，参数上的优化</li>
<li>进行架构级别的缓存，静态化和分布式。</li>
<li>不采用全文检索</li>
<li>采用更快的存储方式，例如 NoSql</li>
</ol>

                
              </div>
            
            <hr/>
            <div>
              <div class="post-metas my-3">
  
    <div class="post-meta mr-3 d-flex align-items-center">
      <i class="iconfont icon-category"></i>
      

<span class="category-chains">
  
  
    
      <span class="category-chain">
        
  <a href="/categories/%E9%9D%A2%E8%AF%95/" class="category-chain-item">面试</a>
  
  

      </span>
    
  
</span>

    </div>
  
  
    <div class="post-meta">
      <i class="iconfont icon-tags"></i>
      
        <a href="/tags/python/">#python</a>
      
    </div>
  
</div>


              
  

  <div class="license-box my-3">
    <div class="license-title">
      <div>面试</div>
      <div>https://sweetshance.github.io/2024/03/22/python后端面试/1-python后端面试/</div>
    </div>
    <div class="license-meta">
      
        <div class="license-meta-item">
          <div>作者</div>
          <div>ShanCe</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>发布于</div>
          <div>2024年3月22日</div>
        </div>
      
      
      
    </div>
    <div class="license-icon iconfont"></div>
  </div>



              
                <div class="post-prevnext my-3">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2024/03/29/redis/%E5%86%85%E5%AD%98%E8%B6%85%E5%87%BA/" title="Redis报错“ OOM command not allowed when used memory &gt; &#39;maxmemory&#39; ”">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">Redis报错“ OOM command not allowed when used memory &gt; &#39;maxmemory&#39; ”</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2024/01/19/python%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E7%82%B9/requests%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86/" title="requests使用代理">
                        <span class="hidden-mobile">requests使用代理</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>

    <div class="side-col d-none d-lg-block col-lg-2">
      
  <aside class="sidebar" style="margin-left: -1rem">
    <div id="toc">
  <p class="toc-header">
    <i class="iconfont icon-list"></i>
    <span>目录</span>
  </p>
  <div class="toc-body" id="toc-body"></div>
</div>



  </aside>


    </div>
  </div>
</div>





  



  



  



  



  







    

    
      <a id="scroll-top-button" aria-label="TOP" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v" for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>

    

    
  </main>

  <footer>
    <div class="footer-inner">
  
    <div class="footer-content">
       <a href="http://82.157.172.231/" target="_blank" rel="nofollow noopener"><span>无聊</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>ShanCe</span></a> 
    </div>
  
  
    <div class="statistics">
  
  

  
    
      <span id="busuanzi_container_site_pv" style="display: none">
        总访问量 
        <span id="busuanzi_value_site_pv"></span>
         次
      </span>
    
    
      <span id="busuanzi_container_site_uv" style="display: none">
        总访客数 
        <span id="busuanzi_value_site_uv"></span>
         人
      </span>
    
    
  
</div>

  
  
  
</div>

  </footer>

  <!-- Scripts -->
  
  <script  src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://lib.baomitu.com/jquery/3.6.0/jquery.min.js" ></script>
<script  src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js" ></script>
<script  src="/js/events.js" ></script>
<script  src="/js/plugins.js" ></script>


  <script  src="https://lib.baomitu.com/typed.js/2.0.12/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var subtitle = document.getElementById('subtitle');
      if (!subtitle || !typing) {
        return;
      }
      var text = subtitle.getAttribute('data-typed-text');
      
        typing(text);
      
    })(window, document);
  </script>




  
    <script  src="/js/img-lazyload.js" ></script>
  




  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.18.2/tocbot.min.js', function() {
    var toc = jQuery('#toc');
    if (toc.length === 0 || !window.tocbot) { return; }
    var boardCtn = jQuery('#board-ctn');
    var boardTop = boardCtn.offset().top;

    window.tocbot.init(Object.assign({
      tocSelector     : '#toc-body',
      contentSelector : '.markdown-body',
      linkClass       : 'tocbot-link',
      activeLinkClass : 'tocbot-active-link',
      listClass       : 'tocbot-list',
      isCollapsedClass: 'tocbot-is-collapsed',
      collapsibleClass: 'tocbot-is-collapsible',
      scrollSmooth    : true,
      includeTitleTags: true,
      headingsOffset  : -boardTop,
    }, CONFIG.toc));
    if (toc.find('.toc-list-item').length > 0) {
      toc.css('visibility', 'visible');
    }

    Fluid.events.registerRefreshCallback(function() {
      if ('tocbot' in window) {
        tocbot.refresh();
        var toc = jQuery('#toc');
        if (toc.length === 0 || !tocbot) {
          return;
        }
        if (toc.find('.toc-list-item').length > 0) {
          toc.css('visibility', 'visible');
        }
      }
    });
  });
</script>


  <script src=https://lib.baomitu.com/clipboard.js/2.0.11/clipboard.min.js></script>

  <script>Fluid.plugins.codeWidget();</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/4.3.1/anchor.min.js', function() {
    window.anchors.options = {
      placement: CONFIG.anchorjs.placement,
      visible  : CONFIG.anchorjs.visible
    };
    if (CONFIG.anchorjs.icon) {
      window.anchors.options.icon = CONFIG.anchorjs.icon;
    }
    var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
    var res = [];
    for (var item of el) {
      res.push('.markdown-body > ' + item.trim());
    }
    if (CONFIG.anchorjs.placement === 'left') {
      window.anchors.options.class = 'anchorjs-link-left';
    }
    window.anchors.add(res.join(', '));

    Fluid.events.registerRefreshCallback(function() {
      if ('anchors' in window) {
        anchors.removeAll();
        var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
        var res = [];
        for (var item of el) {
          res.push('.markdown-body > ' + item.trim());
        }
        if (CONFIG.anchorjs.placement === 'left') {
          anchors.options.class = 'anchorjs-link-left';
        }
        anchors.add(res.join(', '));
      }
    });
  });
</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
    Fluid.plugins.fancyBox();
  });
</script>


  <script>Fluid.plugins.imageCaption();</script>

  <script  src="/js/local-search.js" ></script>

  <script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" ></script>





<!-- 主题的启动项，将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script  src="/js/boot.js" ></script>


  

  <noscript>
    <div class="noscript-warning">博客在允许 JavaScript 运行的环境下浏览效果更佳</div>
  </noscript>
</body>
</html>
